/*
* Sun Public License Notice
*
* The contents of this file are subject to the Sun Public License
* Version 1.0 (the "License"). You may not use this file except in
* compliance with the License. A copy of the License is available at
* http://www.sun.com/
*
* The Original Code is Forte for Java, Community Edition. The Initial
* Developer of the Original Code is Sun Microsystems, Inc. Portions
* Copyright 1997-2000 Sun Microsystems, Inc. All Rights Reserved.
*/
package org.netbeans.modules.form;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.beans.*;
import java.util.ArrayList;
import java.util.Iterator;
import javax.swing.DefaultComboBoxModel;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import org.openide.explorer.propertysheet.editors.EnhancedCustomPropertyEditor;
import org.openide.util.HelpCtx;
import org.openide.util.Utilities;
/** The ParametersPicker is a panel which allows to enter a method parameter data.
*
* @author Ian Formanek
*/
public class ParametersPicker extends javax.swing.JPanel implements EnhancedCustomPropertyEditor {
static final long serialVersionUID =1116033799965380000L;
/** Initializes the Form */
public ParametersPicker(FormManager2 manager, RADComponent sourceComponent, Class requiredType) {
initComponents ();
this.requiredType = requiredType;
this.manager = manager;
this.sourceComponent = sourceComponent;
javax.swing.ButtonGroup bg = new javax.swing.ButtonGroup ();
bg.add (valueButton);
bg.add (beanButton);
bg.add (propertyButton);
bg.add (methodButton);
bg.add (codeButton);
if ((!requiredType.isPrimitive ()) &&
(!requiredType.equals (String.class))) {
valueButton.setEnabled (false);
propertyButton.setSelected (true);
}
// localize components
setBorder (new javax.swing.border.CompoundBorder (
new javax.swing.border.TitledBorder (
new javax.swing.border.EtchedBorder (), " " + FormEditor.getFormBundle ().getString ("CTL_CW_GetParametersFrom") + " "), // "Get Parameter From:"
new javax.swing.border.EmptyBorder (new java.awt.Insets(5, 5, 5, 5))));
valueButton.setText (FormEditor.getFormBundle ().getString ("CTL_CW_Value")); // "Value:"
beanButton.setText (FormEditor.getFormBundle ().getString ("CTL_CW_Bean")); // "Bean:"
propertyButton.setText (FormEditor.getFormBundle ().getString ("CTL_CW_Property")); // "Property:"
propertyLabel.setText (FormEditor.getFormBundle ().getString ("CTL_CW_NoProperty")); // "<No Property Selected>"
methodButton.setText (FormEditor.getFormBundle ().getString ("CTL_CW_Method")); // "Method Call:"
methodLabel.setText (FormEditor.getFormBundle ().getString ("CTL_CW_NoMethod")); // "<No Method Selected>"
codeButton.setText (FormEditor.getFormBundle ().getString ("CTL_CW_UserCode")); // "User Code:"
beansList = new ArrayList ();
DefaultComboBoxModel beanComboModel = new DefaultComboBoxModel ();
beanComboModel.addElement (FormEditor.getFormBundle ().getString ("CTL_CW_SelectBean"));
for (Iterator it = sourceComponent.getFormManager ().getAllComponents ().iterator (); it.hasNext ();) {
RADComponent radComp = (RADComponent)it.next ();
if (requiredType.isAssignableFrom (radComp.getBeanClass ())) {
beansList.add (radComp);
if (radComp instanceof RADFormContainer) {
beanComboModel.addElement (FormEditor.getFormBundle ().getString ("CTL_FormTopContainerName"));
} else {
beanComboModel.addElement (radComp.getName ());
}
}
}
if (beansList.size () > 0) {
beanCombo.setModel (beanComboModel);
beanCombo.addItemListener (new ItemListener () {
public void itemStateChanged (ItemEvent evt) {
int index = beanCombo.getSelectedIndex ();
if (index == 0) {
selectedComponent = null;
} else {
selectedComponent = (RADComponent)beansList.get (index - 1);
}
fireStateChange ();
}
}
);
} else {
beanButton.setEnabled (false); // no beans on the form are of the required type
}
codeArea.setContentType ("text/x-java"); // allow syntax coloring // NOI18N
updateParameterTypes ();
currentFilledState = isFilled ();
HelpCtx.setHelpIDString (this, ParametersPicker.class.getName ());
}
public void setPropertyValue (RADConnectionPropertyEditor.RADConnectionDesignValue value) {
if (value == null) return; // can happen if starting without previously set value
switch (value.type) {
case RADConnectionPropertyEditor.RADConnectionDesignValue.TYPE_VALUE:
valueButton.setSelected (true);
valueField.setText (value.value);
break;
case RADConnectionPropertyEditor.RADConnectionDesignValue.TYPE_BEAN:
beanButton.setSelected (true);
selectedComponent = value.getRADComponent ();
int index = beansList.indexOf (selectedComponent);
if (index == -1) {
beanCombo.setSelectedIndex (0);
} else {
beanCombo.setSelectedIndex (index+1);
}
break;
case RADConnectionPropertyEditor.RADConnectionDesignValue.TYPE_PROPERTY:
propertyButton.setSelected (true);
selectedComponent = value.getRADComponent ();
selectedProperty = value.getProperty ();
if (selectedComponent instanceof FormContainer) {
propertyLabel.setText (selectedProperty.getName ());
} else {
propertyLabel.setText (selectedComponent.getName () + "." + selectedProperty.getName ()); // NOI18N
}
break;
case RADConnectionPropertyEditor.RADConnectionDesignValue.TYPE_METHOD:
methodButton.setSelected (true);
selectedComponent = value.getRADComponent ();
selectedMethod = value.getMethod ();
if (selectedComponent instanceof FormContainer) {
methodLabel.setText (selectedMethod.getName ());
} else {
methodLabel.setText (selectedComponent.getName () + "." + selectedMethod.getName ()); // NOI18N
}
break;
case RADConnectionPropertyEditor.RADConnectionDesignValue.TYPE_CODE:
default:
codeButton.setSelected (true);
codeArea.setText (value.userCode);
break;
}
// update enabled state
updateParameterTypes ();
}
// ----------------------------------------------------------------------------------------
// EnhancedCustomPropertyEditor implementation
/** Get the customized property value.
* @return the property value
* @exception InvalidStateException when the custom property editor does not contain a valid property value
* (and thus it should not be set)
*/
public Object getPropertyValue () throws IllegalStateException {
if (!isFilled ()) throw new IllegalStateException ();
if (valueButton.isSelected ()) {
return new RADConnectionPropertyEditor.RADConnectionDesignValue (requiredType, valueField.getText ());
} else if (beanButton.isSelected ()) {
return new RADConnectionPropertyEditor.RADConnectionDesignValue (selectedComponent);
} else if (codeButton.isSelected ()) {
return new RADConnectionPropertyEditor.RADConnectionDesignValue (codeArea.getText ());
} else if (propertyButton.isSelected ()) {
return new RADConnectionPropertyEditor.RADConnectionDesignValue (selectedComponent, selectedProperty);
} else if (methodButton.isSelected ()) {
return new RADConnectionPropertyEditor.RADConnectionDesignValue (selectedComponent, selectedMethod);
} else return null;
}
// ----------------------------------------------------------------------------------------
// end of EnhancedCustomPropertyEditor implementation
public String getPreviewText () {
if (!isFilled ())
return FormEditor.getFormBundle ().getString ("CTL_CW_NotSet"); // "<not set>"
if (codeButton.isSelected ()) {
return FormEditor.getFormBundle ().getString ("CTL_CW_Code"); // "<code>";
}
return getText ();
}
public String getText () {
if (!isFilled ())
return FormEditor.getFormBundle ().getString ("CTL_CW_NotSet"); // "<not set>"
if (valueButton.isSelected ()) {
if (requiredType.equals (String.class)) {
String s = valueField.getText ();
s = Utilities.replaceString (s, "\\", "\\\\"); // fixes bug 835 // NOI18N
s = Utilities.replaceString (s, "\"", "\\\""); // NOI18N
return "\""+s+"\""; // NOI18N
}
else
return (valueField.getText () != null) ? valueField.getText () : ""; // NOI18N
} else if (codeButton.isSelected ()) {
return codeArea.getText ();
} else if (beanButton.isSelected ()) {
if (selectedComponent instanceof FormContainer) {
return "this"; // NOI18N
} else {
return (selectedComponent.getName ());
}
} else if (propertyButton.isSelected ()) {
StringBuffer sb = new StringBuffer ();
if (!(selectedComponent instanceof FormContainer)) {
sb.append (selectedComponent.getName ());
sb.append ("."); // NOI18N
}
if (selectedProperty != null) {
sb.append (selectedProperty.getReadMethod ().getName ());
sb.append (" ()"); // NOI18N
} else {
sb.append ("???"); // NOI18N
}
return sb.toString ();
} else if (methodButton.isSelected ()) {
StringBuffer sb = new StringBuffer ();
if (!(selectedComponent instanceof FormContainer)) {
sb.append (selectedComponent.getName ());
sb.append ("."); // NOI18N
}
sb.append (selectedMethod.getName ()); // [FUTURE: - method parameters]
sb.append (" ()"); // NOI18N
return sb.toString ();
} else return ""; // NOI18N
}
public boolean isFilled () {
if (codeButton.isSelected ()) {
if (requiredType.equals (String.class)) return true;
else return !"".equals (codeArea.getText ()); // NOI18N
} else if (beanButton.isSelected ()) {
return (selectedComponent != null);
} else if (propertyButton.isSelected ()) {
return (selectedProperty != null);
} else if (valueButton.isSelected ()) {
if (requiredType.equals (String.class)) return true;
else return !"".equals (valueField.getText ()); // NOI18N
} else if (methodButton.isSelected ()) {
return (selectedMethod != null);
} else return false;
}
public synchronized void addChangeListener (ChangeListener l) {
if (listeners == null)
listeners = new ArrayList ();
listeners.add (l);
}
public synchronized void removeListener (ChangeListener l) {
if (listeners == null)
return;
listeners.remove (l);
}
private synchronized void fireStateChange () {
if (listeners == null)
return;
ArrayList list = (ArrayList)listeners.clone ();
ChangeEvent evt = new ChangeEvent (this);
for (Iterator it = list.iterator (); it.hasNext ();)
((ChangeListener)it.next ()).stateChanged (evt);
}
/** This method is called from within the constructor to
* initialize the form.
* WARNING: Do NOT modify this code. The content of this method is
* always regenerated by the FormEditor.
*/
private void initComponents () {//GEN-BEGIN:initComponents
valueButton = new javax.swing.JRadioButton ();
valueField = new javax.swing.JTextField ();
beanButton = new javax.swing.JRadioButton ();
beanCombo = new javax.swing.JComboBox ();
propertyButton = new javax.swing.JRadioButton ();
propertyLabel = new javax.swing.JLabel ();
propertyDetailsButton = new javax.swing.JButton ();
methodButton = new javax.swing.JRadioButton ();
methodLabel = new javax.swing.JLabel ();
methodDetailsButton = new javax.swing.JButton ();
codeButton = new javax.swing.JRadioButton ();
codeScrollPane = new javax.swing.JScrollPane ();
codeArea = new javax.swing.JEditorPane ();
setLayout (new java.awt.GridBagLayout ());
java.awt.GridBagConstraints gridBagConstraints1;
valueButton.setSelected (true);
valueButton.setText (FormEditor.getFormBundle ().getString ("CTL_CW_Value"));
valueButton.addActionListener (new java.awt.event.ActionListener () {
public void actionPerformed (java.awt.event.ActionEvent evt) {
typeButtonPressed (evt);
}
}
);
gridBagConstraints1 = new java.awt.GridBagConstraints ();
gridBagConstraints1.anchor = java.awt.GridBagConstraints.WEST;
add (valueButton, gridBagConstraints1);
valueField.addCaretListener (new javax.swing.event.CaretListener () {
public void caretUpdate (javax.swing.event.CaretEvent evt) {
updateState (evt);
}
}
);
gridBagConstraints1 = new java.awt.GridBagConstraints ();
gridBagConstraints1.gridwidth = 0;
gridBagConstraints1.fill = java.awt.GridBagConstraints.HORIZONTAL;
gridBagConstraints1.insets = new java.awt.Insets (0, 0, 5, 0);
gridBagConstraints1.weightx = 1.0;
add (valueField, gridBagConstraints1);
beanButton.setText (FormEditor.getFormBundle ().getString ("CTL_CW_Bean"));
beanButton.addActionListener (new java.awt.event.ActionListener () {
public void actionPerformed (java.awt.event.ActionEvent evt) {
typeButtonPressed (evt);
}
}
);
gridBagConstraints1 = new java.awt.GridBagConstraints ();
gridBagConstraints1.anchor = java.awt.GridBagConstraints.WEST;
add (beanButton, gridBagConstraints1);
gridBagConstraints1 = new java.awt.GridBagConstraints ();
gridBagConstraints1.gridwidth = 0;
gridBagConstraints1.fill = java.awt.GridBagConstraints.HORIZONTAL;
gridBagConstraints1.insets = new java.awt.Insets (0, 0, 5, 0);
add (beanCombo, gridBagConstraints1);
propertyButton.setText (FormEditor.getFormBundle ().getString ("CTL_CW_Property"));
propertyButton.addActionListener (new java.awt.event.ActionListener () {
public void actionPerformed (java.awt.event.ActionEvent evt) {
typeButtonPressed (evt);
}
}
);
gridBagConstraints1 = new java.awt.GridBagConstraints ();
gridBagConstraints1.anchor = java.awt.GridBagConstraints.WEST;
add (propertyButton, gridBagConstraints1);
propertyLabel.setText (FormEditor.getFormBundle ().getString ("CTL_CW_NoProperty"));
propertyLabel.setEnabled (false);
gridBagConstraints1 = new java.awt.GridBagConstraints ();
gridBagConstraints1.fill = java.awt.GridBagConstraints.HORIZONTAL;
gridBagConstraints1.weightx = 1.0;
add (propertyLabel, gridBagConstraints1);
propertyDetailsButton.setText ("..."); // NOI18N
propertyDetailsButton.addActionListener (new java.awt.event.ActionListener () {
public void actionPerformed (java.awt.event.ActionEvent evt) {
propertyDetailsButtonActionPerformed (evt);
}
}
);
gridBagConstraints1 = new java.awt.GridBagConstraints ();
gridBagConstraints1.gridwidth = 0;
gridBagConstraints1.insets = new java.awt.Insets (5, 0, 0, 0);
add (propertyDetailsButton, gridBagConstraints1);
methodButton.setText (FormEditor.getFormBundle ().getString ("CTL_CW_MethodCall"));
methodButton.addActionListener (new java.awt.event.ActionListener () {
public void actionPerformed (java.awt.event.ActionEvent evt) {
typeButtonPressed (evt);
}
}
);
gridBagConstraints1 = new java.awt.GridBagConstraints ();
gridBagConstraints1.anchor = java.awt.GridBagConstraints.WEST;
add (methodButton, gridBagConstraints1);
methodLabel.setText (FormEditor.getFormBundle ().getString ("CTL_CW_NoMethod"));
methodLabel.setEnabled (false);
gridBagConstraints1 = new java.awt.GridBagConstraints ();
gridBagConstraints1.fill = java.awt.GridBagConstraints.HORIZONTAL;
gridBagConstraints1.weightx = 1.0;
add (methodLabel, gridBagConstraints1);
methodDetailsButton.setText ("..."); // NOI18N
methodDetailsButton.addActionListener (new java.awt.event.ActionListener () {
public void actionPerformed (java.awt.event.ActionEvent evt) {
methodDetailsButtonActionPerformed (evt);
}
}
);
gridBagConstraints1 = new java.awt.GridBagConstraints ();
gridBagConstraints1.gridwidth = 0;
gridBagConstraints1.insets = new java.awt.Insets (5, 0, 0, 0);
add (methodDetailsButton, gridBagConstraints1);
codeButton.setText (FormEditor.getFormBundle ().getString ("CTL_CW_UserCode"));
codeButton.addActionListener (new java.awt.event.ActionListener () {
public void actionPerformed (java.awt.event.ActionEvent evt) {
typeButtonPressed (evt);
}
}
);
gridBagConstraints1 = new java.awt.GridBagConstraints ();
gridBagConstraints1.anchor = java.awt.GridBagConstraints.NORTHWEST;
add (codeButton, gridBagConstraints1);
codeArea.setEditable (false);
codeArea.addCaretListener (new javax.swing.event.CaretListener () {
public void caretUpdate (javax.swing.event.CaretEvent evt) {
updateState (evt);
}
}
);
codeScrollPane.setViewportView (codeArea);
gridBagConstraints1 = new java.awt.GridBagConstraints ();
gridBagConstraints1.gridwidth = 0;
gridBagConstraints1.fill = java.awt.GridBagConstraints.BOTH;
gridBagConstraints1.insets = new java.awt.Insets (5, 0, 0, 0);
gridBagConstraints1.weightx = 1.0;
gridBagConstraints1.weighty = 1.0;
add (codeScrollPane, gridBagConstraints1);
}//GEN-END:initComponents
private void methodDetailsButtonActionPerformed (java.awt.event.ActionEvent evt) {//GEN-FIRST:event_methodDetailsButtonActionPerformed
MethodPicker picker = new MethodPicker (null, manager, sourceComponent, requiredType);
picker.setSelectedComponent (selectedComponent);
picker.setSelectedMethod (selectedMethod);
picker.show ();
if (picker.getReturnStatus () == MethodPicker.OK) {
selectedComponent = picker.getSelectedComponent ();
selectedMethod = picker.getSelectedMethod ();
methodLabel.setEnabled (true);
if (selectedComponent instanceof FormContainer) {
methodLabel.setText (selectedMethod.getName ());
} else {
methodLabel.setText (selectedComponent.getName () + "." + selectedMethod.getName ()); // NOI18N
}
methodLabel.repaint ();
fireStateChange ();
}
}//GEN-LAST:event_methodDetailsButtonActionPerformed
private void updateState (javax.swing.event.CaretEvent evt) {//GEN-FIRST:event_updateState
fireStateChange ();
}//GEN-LAST:event_updateState
private void propertyDetailsButtonActionPerformed (java.awt.event.ActionEvent evt) {//GEN-FIRST:event_propertyDetailsButtonActionPerformed
if (propertyPicker == null) {
propertyPicker = new PropertyPicker (null, manager, sourceComponent, requiredType);
}
propertyPicker.setSelectedComponent (selectedComponent);
propertyPicker.setSelectedProperty (selectedProperty);
propertyPicker.show ();
if (propertyPicker.getReturnStatus () == PropertyPicker.OK) {
selectedComponent = propertyPicker.getSelectedComponent ();
selectedProperty = propertyPicker.getSelectedProperty ();
propertyLabel.setEnabled (true);
if (selectedComponent instanceof FormContainer) {
propertyLabel.setText (selectedProperty.getName ());
} else {
propertyLabel.setText (selectedComponent.getName () + "." + selectedProperty.getName ()); // NOI18N
}
propertyLabel.repaint ();
fireStateChange ();
}
}//GEN-LAST:event_propertyDetailsButtonActionPerformed
private void typeButtonPressed (java.awt.event.ActionEvent evt) {//GEN-FIRST:event_typeButtonPressed
updateParameterTypes ();
if (beanButton.isSelected ()) {
beanCombo.requestFocus ();
} else if (codeButton.isSelected ()) {
codeArea.requestFocus ();
} else if (propertyButton.isSelected ()) {
propertyDetailsButton.requestFocus ();
} else if (methodButton.isSelected ()) {
methodDetailsButton.requestFocus ();
}
}//GEN-LAST:event_typeButtonPressed
private void updateParameterTypes () {
valueField.setEnabled (valueButton.isSelected ());
beanCombo.setEnabled (beanButton.isSelected ());
if (!propertyButton.isSelected ()) {
propertyLabel.setText (FormEditor.getFormBundle ().getString ("CTL_CW_NoProperty")); // "<No Property Selected>"
}
propertyLabel.setEnabled (propertyButton.isSelected ());
propertyLabel.repaint ();
propertyDetailsButton.setEnabled (propertyButton.isSelected ());
if (!methodButton.isSelected ()) {
methodLabel.setText (FormEditor.getFormBundle ().getString ("CTL_CW_NoMethod")); // "<No Method Selected>"
}
methodLabel.setEnabled (methodButton.isSelected ());
methodLabel.repaint ();
methodDetailsButton.setEnabled (methodButton.isSelected ());
codeArea.setEditable (codeButton.isSelected ());
fireStateChange ();
}
// Variables declaration - do not modify//GEN-BEGIN:variables
private javax.swing.JRadioButton valueButton;
private javax.swing.JTextField valueField;
private javax.swing.JRadioButton beanButton;
private javax.swing.JComboBox beanCombo;
private javax.swing.JRadioButton propertyButton;
private javax.swing.JLabel propertyLabel;
private javax.swing.JButton propertyDetailsButton;
private javax.swing.JRadioButton methodButton;
private javax.swing.JLabel methodLabel;
private javax.swing.JButton methodDetailsButton;
private javax.swing.JRadioButton codeButton;
private javax.swing.JScrollPane codeScrollPane;
private javax.swing.JEditorPane codeArea;
// End of variables declaration//GEN-END:variables
private FormManager2 manager;
private RADComponent sourceComponent;
private Class requiredType;
private PropertyPicker propertyPicker;
private MethodPicker methodPicker;
private String selectedPropertyText = null;
/**
* @associates ChangeListener
*/
private ArrayList listeners;
private boolean currentFilledState;
private RADComponent selectedComponent;
private PropertyDescriptor selectedProperty;
private MethodDescriptor selectedMethod;
/**
* @associates RADComponent
*/
private ArrayList beansList;
private DefaultComboBoxModel beanComboModel;
}
/*
* Log
* 20 Gandalf 1.19 1/13/00 Ian Formanek NOI18N #2
* 19 Gandalf 1.18 1/12/00 Pavel Buzek I18N
* 18 Gandalf 1.17 1/10/00 Ian Formanek Fixed bug 4936 -
* Incorrect initialization of Form Connection dialog
* 17 Gandalf 1.16 1/5/00 Ian Formanek NOI18N
* 16 Gandalf 1.15 11/27/99 Patrik Knakal
* 15 Gandalf 1.14 10/23/99 Ian Formanek NO SEMANTIC CHANGE - Sun
* Microsystems Copyright in File Comment
* 14 Gandalf 1.13 10/10/99 Ian Formanek Removed debug printlns
* 13 Gandalf 1.12 8/15/99 Ian Formanek Further finetuned last
* change
* 12 Gandalf 1.11 8/15/99 Ian Formanek Extended
* ParametersPicker with "Bean" value
* 11 Gandalf 1.10 7/31/99 Ian Formanek Cleaned up comments
* 10 Gandalf 1.9 7/11/99 Ian Formanek JEditorPane instead of
* JTextArea for user code (WARNING: in guarded code, so opening the form
* will destroy this change)
* 9 Gandalf 1.8 7/8/99 Jesse Glick Context help.
* 8 Gandalf 1.7 6/30/99 Ian Formanek reflecting change in
* enhanced property editors interfaces
* 7 Gandalf 1.6 6/27/99 Ian Formanek Can be used in
* RADConnectionPropertyEditor as custom editor
* 6 Gandalf 1.5 6/9/99 Ian Formanek ---- Package Change To
* org.openide ----
* 5 Gandalf 1.4 6/1/99 Ian Formanek Fixed removed event
* handlers
* 4 Gandalf 1.3 5/31/99 Ian Formanek Updated to X2 form
* format
* 3 Gandalf 1.2 5/15/99 Ian Formanek
* 2 Gandalf 1.1 5/15/99 Ian Formanek
* 1 Gandalf 1.0 5/13/99 Ian Formanek
* $
*/